package modelovectorial.core;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelovectorial.Palabra;
import modelovectorial.PalabraSucia;
import utn.frc.tsb.utils.ValerioFritelli.HashTable.HashTable;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase representa un diccionario que contiene los terminos limpios y los
 * terminos con signos de puntuacion que estan guardados dentro de la bd.
 */
/**
 * Constructor por parametros que inicializa las variables de la clase.
 *
 * @param pConnection una conexion a la base de datos.
 */
public class Diccionario {

    private HashTable diccionarioLimpio;
    private HashTable diccionarioSucio;

    public Diccionario(Connection pConnection) {
        cargarDiccionario(pConnection);
    }

    /**
     * Carga las tablas hash "diccionarioLimpio" y "diccionarioSucio" con los
     * terminos que se encuentran almacenados en la base de datos.
     *
     * @param pConnection una conexion a la base de datos.
     */
    public void cargarDiccionario(Connection pConnection) {
        PalabraSucia palabraSucia;
        Palabra palabra;
        try {
            ResultSet result = pConnection.prepareStatement("SELECT COUNT(*) as total FROM terminosucio").executeQuery();
            result.next();
            int minSize = result.getInt("total") * 3;
            if (minSize < 200000) {
                minSize = 200000;
            }
            diccionarioSucio = new HashTable(minSize);
            result = pConnection.prepareStatement("SELECT idTerminoSucio, termino FROM terminosucio").executeQuery();
            while (result.next()) {
                palabraSucia = new PalabraSucia(result.getString("termino"));
                palabraSucia.setIdTerminoSucio(result.getInt("idTerminoSucio"));
                diccionarioSucio.put(palabraSucia);
            }
            result = pConnection.prepareStatement("SELECT COUNT(*) as total FROM termino").executeQuery();
            result.next();
            minSize = result.getInt("total") * 3;
            if (minSize < 200000) {
                minSize = 200000;
            }
            diccionarioLimpio = new HashTable(minSize);
            result = pConnection.prepareStatement("SELECT idTermino, terminoLimpio FROM termino").executeQuery();
            while (result.next()) {
                palabra = new Palabra(result.getInt("idTermino"), result.getString("terminoLimpio"));
                diccionarioLimpio.put(palabra);
            }
        } catch (SQLException e) {
            Logger.getLogger(Diccionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public Palabra getPalabraLimpia(Palabra pPalabra) {
        return (Palabra) diccionarioLimpio.get(pPalabra);
    }

    public PalabraSucia getPalabraSucia(PalabraSucia pPalabra) {
        return (PalabraSucia) diccionarioSucio.get(pPalabra);
    }

    /**
     * Agrega una nueva palabra al diccionario de terminos limpios.
     *
     * @param pPalabra objeto Palabra que sera agregado al diccionario.
     */
    public void addPalabra(Palabra pPalabra) {
        diccionarioLimpio.put(new Palabra(pPalabra.getIdPalabra(), pPalabra.getPalabraLimpia()));
    }

    /**
     * Sobrecarga del metodo addPalabra que agregara unn nuevo termino al
     * diccionario de terminos sucios.
     *
     * @param pPalabra objeto que contiene el termino con signos de puntuacion a
     * agregarse al diccionario.
     */
    public void addPalabra(PalabraSucia pPalabra) {
        PalabraSucia palabra = new PalabraSucia(pPalabra.getPalabraSucia());
        palabra.setIdTerminoSucio(pPalabra.getIdTerminoSucio());
        diccionarioSucio.put(palabra);
    }
}